﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Configuration;
using System.Data.Common;
using Ausy.Survey.Common.Providers;
using Ausy.Servey.QuestionProvider.Contract;
using Ausy.Silverlight.Survey.QuestionModule.Model;


namespace Ausy.Servey.QuestionProvider.DataProvider
{
    /// <summary>
    /// Cette classe représente un gestionnaire d'accès aux données pour la gestion des Questionnaires
    /// </summary>
    public class QuestionnaireDataProvider : BaseDataProvider
    {
        /// <summary>
        /// Cette méthode permet de récupérer un questionnaire avec ses questions
        /// </summary>
        /// <param name="identifier">Identifiant du questionnaire</param>
        /// <returns>Questionnaire</returns>
        public Questionnaire GetQuestionnaireByIdentifier(Guid identifier)
        {
            var result = new Questionnaire();
            var currentQuestionIdentifier = Guid.Empty;

            using (var connection = this.CreateConnection())
            {
                var command = this.CreateCommand(connection, "SelectQuestionnaireByIdentifier");
                command.Parameters.Add(this.CreateParameter("@QuestionnaireID", DbType.Guid, identifier));
                connection.Open();
                using (IDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        result.Identifier = Guid.Parse(Convert.ToString(reader["QuestionnaireID"]));
                        result.Title = Convert.ToString(reader["QuestionnaireTitle"]);

                        if (currentQuestionIdentifier != Guid.Parse(Convert.ToString(reader["QuestionID"])))
                        {
                            currentQuestionIdentifier = Guid.Parse(Convert.ToString(reader["QuestionID"]));
                            var question = new Question();
                            question.Identifier = currentQuestionIdentifier;
                            question.Text = Convert.ToString(reader["QuestionText"]);
                            result.QuestionCollection.Add(question);
                        }

                        var answer = new Answer();
                        answer.Identifier = Guid.Parse(Convert.ToString(reader["AnswerID"]));
                        answer.Text = Convert.ToString(reader["AnswerText"]);
                        answer.IsCorrect = Convert.ToBoolean(reader["AnswerIsCorrect"]);
                        result.QuestionCollection.Last().AnswerCollection.Add(answer);
                    }

                }
                connection.Close();
            }

            return result;
        }


        /// <summary>
        /// Cette méthode permet d'enregistrer la réponse d'un questionnaire par un utilisateur 
        /// </summary>
        /// <param name="userQuestionnaire">Réponse au questionnaire par un utilisateur</param>
        public void CreateUserQuestionnaire(UserQuestionnaire userQuestionnaire)
        {
            using (var connection = this.CreateConnection())
            {
                connection.Open();
                DbTransaction transaction = connection.BeginTransaction();
                var command = this.CreateCommand(connection, "CreateUserQuestionnaire");
                command.Transaction = transaction;
                command.Parameters.Add(this.CreateParameter("@UserQuestionnaireID", DbType.Guid, userQuestionnaire.Identifier));
                command.Parameters.Add(this.CreateParameter("@CompleteTimestamp", DbType.String, Convert.ToString(userQuestionnaire.TimeSpanComplete)));
                command.Parameters.Add(this.CreateParameter("@CompleteResult", DbType.Decimal, userQuestionnaire.QuestionnaireResult));
                command.Parameters.Add(this.CreateParameter("@UserAccountID", DbType.Guid, userQuestionnaire.AccountReferenceID));
                command.Parameters.Add(this.CreateParameter("@QuestionnaireID", DbType.Guid, userQuestionnaire.QuestionnaireReferenceID));
                command.ExecuteNonQuery();

                foreach (var questionnaireResponse in userQuestionnaire.QuestionnaireResponseCollection)
                {
                    var responseCommand = this.CreateCommand(connection, "CreateUserQuestionnaireResponse");
                    responseCommand.Transaction = transaction;
                    responseCommand.Parameters.Add(this.CreateParameter("@UserQuestionnaireResponseCompleteTimestamp", DbType.String, Convert.ToString(questionnaireResponse.TimeSpanComplete)));
                    responseCommand.Parameters.Add(this.CreateParameter("@UserQuestionnaireResponseCompleteText", DbType.String, questionnaireResponse.ResponseCompleteText));
                    responseCommand.Parameters.Add(this.CreateParameter("@UserQuestionnaireResponseCompleteResult", DbType.Decimal, questionnaireResponse.ResponseResult));
                    responseCommand.Parameters.Add(this.CreateParameter("@QuestionID", DbType.Guid, questionnaireResponse.QuestionReferenceID));
                    responseCommand.Parameters.Add(this.CreateParameter("@UserQuestionnaireID", DbType.Guid, userQuestionnaire.Identifier));
                    responseCommand.ExecuteNonQuery();
                }

                transaction.Commit();
                connection.Close();
            }
        }
    }
}

